package cn.tedu.emqx.config;

import cn.tedu.emqx.consumer.EmqxDemoConsumer;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.UUID;

/**
 * 配置类，构建一个emqx底层的客户端对象，类似在rabbitmq床架你的Connection
 * 所有程序代码，实现消息发送、消费，都是通过连接对象完成
 */
@Configuration
public class MqttCliConfig {
    @Bean
    public MqttClient init(){
        MqttClient mqttClient = null;
        try {
            // 初始化client对象，向其提供必要的连接属性：ip 端口号 用户名 密码 虚拟主机
            String address = "tcp://192.168.8.100:1883";  // 包含协议头、ip和端口
            // 每一个客户端都需要一个唯一id值
            String uuid = UUID.randomUUID().toString();
            // 每次启动都会在本地存储一个日志锁文件，需要将该文件的内容放置到内存中 -> new MemoryPersistence()
            mqttClient = new MqttClient(address, uuid, new MemoryPersistence());
            // 需要在客户端船回家年完成之后设置选择属性，以完成功能需要
            MqttConnectOptions options = new MqttConnectOptions();
            // 必须填写的授权认证（用户名密码）
            options.setUserName("admin");
            options.setPassword("123qqq...A".toCharArray());
            //作为了解
            //options.setCleanSession(true);  // 设置客户端是否断开连接后，是否清除缓存数据
            //options.setKeepAliveInterval(30);  // 设置心跳时间
            //options.setConnectionTimeout(30);  // 设置连接超时时间
            //options.setAutomaticReconnect(true);  // 设置是否自动重连
            //通过选项建立client客户端和服务端连接
            mqttClient.setCallback(new EmqxDemoConsumer(mqttClient));  // 添加消费者回调对象
            mqttClient.connect(options);
            // ToDO 必须填写的属性 消费回调对象 开发消费者
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("创建连接失败");
        }
        return mqttClient;
    }
}
